package com.supermap.supermap.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.supermap.data.*;

import java.util.ArrayList;
import java.util.List;

public class Result {

    public static final Object getPrjCoordSysAttributeGeoRegion(DatasetVector resultDataset) {
        //存储空间信息、属性信息、节点信息
        JSONObject jsonPrjCoordSysAttributeGeoRegion = new JSONObject();
        //空间信息
        JSONObject prjCoordSysObj = new JSONObject();
        PrjCoordSys prjCoordSys = resultDataset.getPrjCoordSys();
        prjCoordSysObj.put("EPSG代码", prjCoordSys.getEPSGCode());
        prjCoordSysObj.put("投影坐标系名称", prjCoordSys.getName());
        prjCoordSysObj.put("投影坐标系类型", prjCoordSys.getType().name());
        prjCoordSysObj.put("地理坐标系名称", prjCoordSys.getGeoCoordSys().getName());
        prjCoordSysObj.put("地理坐标系类型", prjCoordSys.getGeoCoordSys().getType().name());
        prjCoordSysObj.put("大地参照系名称", prjCoordSys.getGeoCoordSys().getGeoDatum().getName());
        prjCoordSysObj.put("大地参照系类型", prjCoordSys.getGeoCoordSys().getGeoDatum().getType().name());
        prjCoordSysObj.put("地球椭球体名称", prjCoordSys.getGeoCoordSys().getGeoDatum().getGeoSpheroid().getName());
        prjCoordSysObj.put("地球椭球体类型", prjCoordSys.getGeoCoordSys().getGeoDatum().getGeoSpheroid().getType().name());
        prjCoordSysObj.put("地球椭球体的长半径", prjCoordSys.getGeoCoordSys().getGeoDatum().getGeoSpheroid().getAxis());
        prjCoordSysObj.put("地球椭球体的扁率", prjCoordSys.getGeoCoordSys().getGeoDatum().getGeoSpheroid().getFlatten());
        prjCoordSysObj.put("中央子午线", prjCoordSys.getGeoCoordSys().getGeoPrimeMeridian().getLongitudeValue());
        prjCoordSysObj.put("投影方式", prjCoordSys.getProjection().getName());
        prjCoordSysObj.put("中央经线", prjCoordSys.getGeoCoordSys().getGeoPrimeMeridian().getLongitudeValue());
        jsonPrjCoordSysAttributeGeoRegion.put("空间信息", prjCoordSysObj);
        //属性信息、节点信息
        JSONArray jsonAttributeGeoRegion = new JSONArray();
        Recordset recordset = resultDataset.getRecordset(false, CursorType.STATIC);
        if (recordset != null && recordset.getRecordCount() > 0) {
            // 先获取属性字段名称
            List<String> fieldNames = new ArrayList<>();
            FieldInfos fieldInfos = recordset.getFieldInfos();
            for (int j = 0; j < fieldInfos.getCount(); j++) {
                // 过滤SuperMap 系统字段
                if (fieldInfos.get(j).isSystemField())
                    continue;
                fieldNames.add(fieldInfos.get(j).getName());
            }
            recordset.moveFirst();
            while (!recordset.isEOF()) {
                //当前记录的信息（属性信息、节点信息）
                JSONObject recordsetCurrent = new JSONObject();
                // 获取属性信息
                JSONObject jsonAttribute = new JSONObject();
                for (int k = 0; k < fieldNames.size(); k++) {
                    String fieldName = fieldNames.get(k);
                    jsonAttribute.put(fieldName, recordset.getFieldValue(fieldName));
                }
                recordsetCurrent.put("属性信息",jsonAttribute);
//                map.put("属性信息",jsonAttribute);
                JSONObject jsonGeoRegion = new JSONObject();
                // 获取面几何对象
                GeoRegion geometry = (GeoRegion) recordset.getGeometry();
                //面几何对象子对象的个数
                int partCount = geometry.getPartCount();
                for (int l = 0; l < partCount; l++) {
                    JSONArray geometryPartJSONArray = new JSONArray();
                    //每个子对象可能由多个有序坐标点集合来表示
                    Point2Ds point2Ds = geometry.getPart(l);
                    //坐标点的个数
                    int point2DsCount = point2Ds.getCount();

                    for (int m = 0; m < point2DsCount; m++) {
                        Point2D point2D = point2Ds.getItem(m);
                        JSONObject jb = new JSONObject();
                        jb.put("x", point2D.getX());
                        jb.put("y", point2D.getY());
                        geometryPartJSONArray.add(jb);
                    }
                    jsonGeoRegion.put("当前记录的子对象节点信息",geometryPartJSONArray);
                }
                recordsetCurrent.put("当前记录的多个子对象的节点信息",jsonGeoRegion);
                jsonAttributeGeoRegion.add(recordsetCurrent);
                recordset.moveNext();
            }
            jsonPrjCoordSysAttributeGeoRegion.put("属性信息、节点信息",jsonAttributeGeoRegion);
            recordset.close();
            recordset.dispose();
        }
        return jsonPrjCoordSysAttributeGeoRegion;
    }
}
